Reactμ useFormStateλ₯Ό μ¬μ©νμ¬ νΌ μν λ³κ²½μ ν¨κ³Όμ μΌλ‘ μΆμ νλ λ°©λ²μ μμ보μΈμ. μ°¨μ΄ κ°μ§, μ±λ₯ μ΅μ ν, κ²¬κ³ ν UI κ΅¬μΆ κΈ°μ μ λ§μ€ν°νμΈμ.
React useFormState λ³κ²½ κ°μ§: νΌ μν μ°¨μ΄ μΆμ λ§μ€ν°νκΈ°
λμ μΈ μΉ κ°λ° μΈκ³μμ μ¬μ©μ μΉνμ μ΄κ³ ν¨μ¨μ μΈ νΌμ λ§λλ κ²μ λ§€μ° μ€μν©λλ€. μ¬μ©μ μΈν°νμ΄μ€ ꡬμΆμ μν μΈκΈ° μλ JavaScript λΌμ΄λΈλ¬λ¦¬μΈ Reactλ νΌ κ΄λ¦¬λ₯Ό μν λ€μν λꡬλ₯Ό μ 곡ν©λλ€. κ·Έμ€μμλ useFormState ν
μ νΌμ μνλ₯Ό κ΄λ¦¬νκ³ μΆμ νλ λ₯λ ₯μΌλ‘ λκ°μ λνλ
λλ€. μ΄ μ’
ν© κ°μ΄λμμλ Reactμ useFormStateμ 볡μ‘μ±μ κΉμ΄ νκ³ λ€μ΄, νΉν λ³κ²½ κ°μ§ λ° μ°¨μ΄ μΆμ μ μ΄μ μ λ§μΆμ΄ λ λ°μμ±μ΄ μ’κ³ μ±λ₯μ΄ λ°μ΄λ νΌμ λ§λ€ μ μλλ‘ λμ΅λλ€.
Reactμ useFormState ν μ΄ν΄νκΈ°
useFormState ν
μ μ
λ ₯ κ°, μ ν¨μ± κ²μ¬, μ μΆμ μ²λ¦¬νλ μ€μ μ§μ€μ λ°©λ²μ μ 곡νμ¬ νΌ μν κ΄λ¦¬λ₯Ό λ¨μνν©λλ€. μ΄λ₯Ό ν΅ν΄ κ° κ°λ³ νΌ νλμ λν μνλ₯Ό μλμΌλ‘ κ΄λ¦¬ν νμκ° μμ΄μ Έ μμ©κ΅¬ μ½λλ₯Ό μ€μ΄κ³ μ½λ κ°λ
μ±μ ν₯μμν΅λλ€.
useFormStateλ 무μμΈκ°?
useFormStateλ React μ ν리μΌμ΄μ
μμ νΌ μν κ΄λ¦¬λ₯Ό κ°μννκΈ° μν΄ μ€κ³λ 컀μ€ν
ν
μ
λλ€. μΌλ°μ μΌλ‘ λ€μμ ν¬ν¨νλ κ°μ²΄λ₯Ό λ°νν©λλ€:
- μν λ³μ: νΌ νλμ νμ¬ κ°μ λνλ λλ€.
- μ λ°μ΄νΈ ν¨μ: μ λ ₯ νλκ° λ³κ²½λ λ μν λ³μλ₯Ό μμ ν©λλ€.
- μ ν¨μ± κ²μ¬ ν¨μ: νΌ λ°μ΄ν°λ₯Ό κ²μ¦ν©λλ€.
- μ μΆ νΈλ€λ¬: νΌ μ μΆμ μ²λ¦¬ν©λλ€.
useFormState μ¬μ©μ μ΄μ
- λ¨μνλ μν κ΄λ¦¬: νΌ μνλ₯Ό μ€μ μ§μ€ννμ¬ λ³΅μ‘μ±μ μ€μ λλ€.
- μμ©κ΅¬ μ½λ κ°μ: κ° νλμ λν κ°λ³ μν λ³μ λ° μ λ°μ΄νΈ ν¨μκ° νμ μμ΅λλ€.
- κ°λ μ± ν₯μ: νΌ λ‘μ§μ λ μ½κ² μ΄ν΄νκ³ μ μ§λ³΄μν μ μμ΅λλ€.
- μ±λ₯ ν₯μ: λ³κ²½ μ¬νμ ν¨μ¨μ μΌλ‘ μΆμ νμ¬ λ¦¬λ λλ§μ μ΅μ νν©λλ€.
React νΌμ λ³κ²½ κ°μ§
λ³κ²½ κ°μ§λ νΌμ μνκ° λ³κ²½λμμ λλ₯Ό μλ³νλ κ³Όμ μ λλ€. μ΄λ μ¬μ©μ μΈν°νμ΄μ€ μ λ°μ΄νΈλ₯Ό νΈλ¦¬κ±°νκ³ , νΌ λ°μ΄ν°λ₯Ό κ²μ¦νλ©°, μ μΆ λ²νΌμ νμ±ν λλ λΉνμ±ννλ λ° νμμ μ λλ€. ν¨μ¨μ μΈ λ³κ²½ κ°μ§λ λ°μμ± μκ³ μ±λ₯ μ’μ μ¬μ©μ κ²½νμ μ μ§νλ λ° μ€μν©λλ€.
λ³κ²½ κ°μ§κ° μ€μν μ΄μ
- UI μ λ°μ΄νΈ: νΌ λ°μ΄ν°μ λ³κ²½ μ¬νμ μ€μκ°μΌλ‘ λ°μν©λλ€.
- νΌ μ ν¨μ± κ²μ¬: μ λ ₯ κ°μ΄ λ³κ²½λ λ μ ν¨μ± κ²μ¬ λ‘μ§μ νΈλ¦¬κ±°ν©λλ€.
- μ‘°κ±΄λΆ λ λλ§: νΌ μνμ λ°λΌ μμλ₯Ό νμνκ±°λ μ¨κΉλλ€.
- μ±λ₯ μ΅μ ν: λ³κ²½λ λ°μ΄ν°μ μμ‘΄νλ μ»΄ν¬λνΈλ§ μ λ°μ΄νΈνμ¬ λΆνμν 리λ λλ§μ λ°©μ§ν©λλ€.
λ³κ²½ κ°μ§μ μΌλ°μ μΈ μ κ·Ό λ°©μ
React νΌμμ λ³κ²½ κ°μ§λ₯Ό ꡬννλ λ°©λ²μλ μ¬λ¬ κ°μ§κ° μμ΅λλ€. λ€μμ λͺ κ°μ§ μΌλ°μ μΈ μ κ·Ό λ°©μμ λλ€:
- onChange νΈλ€λ¬:
onChangeμ΄λ²€νΈλ₯Ό μ¬μ©νμ¬ κ° μ λ ₯ νλμ μνλ₯Ό μ λ°μ΄νΈνλ κΈ°λ³Έμ μΈ μ κ·Ό λ°©μμ λλ€. - μ μ΄ μ»΄ν¬λνΈ: μνλ₯Ό ν΅ν΄ νΌ μμμ κ°μ μ μ΄νλ React μ»΄ν¬λνΈμ λλ€.
- useFormState ν : μν κ΄λ¦¬λ₯Ό μ€μ μ§μ€ννκ³ λ΄μ₯λ λ³κ²½ κ°μ§ κΈ°λ₯μ μ 곡νλ λ μ κ΅ν μ κ·Ό λ°©μμ λλ€.
- νΌ λΌμ΄λΈλ¬λ¦¬: Formik λ° React Hook Formκ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ λ³κ²½ κ°μ§ λ° νΌ μ ν¨μ± κ²μ¬λ₯Ό μν κ³ κΈ κΈ°λ₯μ μ 곡ν©λλ€.
useFormStateλ‘ λ³κ²½ κ°μ§ ꡬννκΈ°
useFormState ν
μ μ¬μ©νμ¬ λ³κ²½ κ°μ§λ₯Ό ν¨κ³Όμ μΌλ‘ ꡬννλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€. λ³κ²½ μ¬ν μΆμ , νΌ μν λΉκ΅ λ° μ±λ₯ μ΅μ ν κΈ°μ μ λ€λ£° κ²μ
λλ€.
κΈ°λ³Έμ μΈ λ³κ²½ κ°μ§
useFormStateλ‘ λ³κ²½μ κ°μ§νλ κ°μ₯ κ°λ¨ν λ°©λ²μ ν
μμ μ 곡νλ μ
λ°μ΄νΈ ν¨μλ₯Ό μ¬μ©νλ κ²μ
λλ€. μ΄λ¬ν ν¨μλ μΌλ°μ μΌλ‘ μ
λ ₯ νλμ onChange μ΄λ²€νΈ νΈλ€λ¬ λ΄μμ νΈμΆλ©λλ€.
μμ :
import React, { useState } from 'react';
const useFormState = () => {
const [formState, setFormState] = useState({
firstName: '',
lastName: '',
email: '',
});
const updateField = (field, value) => {
setFormState(prevState => ({
...prevState,
[field]: value,
}));
};
return {
formState,
updateField,
};
};
const MyForm = () => {
const { formState, updateField } = useFormState();
const handleChange = (event) => {
const { name, value } = event.target;
updateField(name, value);
};
return (
);
};
export default MyForm;
μ΄ μμ μμλ μ
λ ₯ νλκ° λ³κ²½λ λλ§λ€ handleChange ν¨μκ° νΈμΆλ©λλ€. μ΄ ν¨μλ updateField ν¨μλ₯Ό νΈμΆνμ¬ formStateμ ν΄λΉ νλλ₯Ό μ
λ°μ΄νΈν©λλ€. μ΄λ μ»΄ν¬λνΈμ 리λ λλ§μ νΈλ¦¬κ±°νμ¬ UIμ μ
λ°μ΄νΈλ κ°μ λ°μν©λλ€.
μ΄μ νΌ μν μΆμ νκΈ°
λλ‘λ νμ¬ νΌ μνλ₯Ό μ΄μ μνμ λΉκ΅νμ¬ λ¬΄μμ΄ λ³κ²½λμλμ§ νμΈν΄μΌ ν λκ° μμ΅λλ€. μ΄λ μ€ν μ·¨μ/λ€μ μ€ν κΈ°λ₯μ ꡬννκ±°λ λ³κ²½ μ¬ν μμ½μ νμνλ λ° μ μ©ν μ μμ΅λλ€.
μμ :
import React, { useState, useRef, useEffect } from 'react';
const useFormStateWithPrevious = () => {
const [formState, setFormState] = useState({
firstName: '',
lastName: '',
email: '',
});
const previousFormStateRef = useRef(formState);
useEffect(() => {
previousFormStateRef.current = formState;
}, [formState]);
const updateField = (field, value) => {
setFormState(prevState => ({
...prevState,
[field]: value,
}));
};
return {
formState,
updateField,
previousFormState: previousFormStateRef.current,
};
};
const MyFormWithPrevious = () => {
const { formState, updateField, previousFormState } = useFormStateWithPrevious();
const handleChange = (event) => {
const { name, value } = event.target;
updateField(name, value);
};
useEffect(() => {
console.log('Current Form State:', formState);
console.log('Previous Form State:', previousFormState);
// Compare current and previous states here
const changes = Object.keys(formState).filter(
key => formState[key] !== previousFormState[key]
);
if (changes.length > 0) {
console.log('Changes:', changes);
}
}, [formState, previousFormState]);
return (
);
};
export default MyFormWithPrevious;
μ΄ μμ μμλ useRef ν
μ μ¬μ©νμ¬ μ΄μ νΌ μνλ₯Ό μ μ₯ν©λλ€. useEffect ν
μ formStateκ° λ³κ²½λ λλ§λ€ previousFormStateRefλ₯Ό μ
λ°μ΄νΈν©λλ€. λν useEffectλ νμ¬ μνμ μ΄μ μνλ₯Ό λΉκ΅νμ¬ λ³κ²½ μ¬νμ μλ³ν©λλ€.
볡μ‘ν κ°μ²΄μ λν κΉμ λΉκ΅
νΌ μνμ 볡μ‘ν κ°μ²΄λ λ°°μ΄μ΄ ν¬ν¨λ κ²½μ°, λ¨μν λλ±μ± κ²μ¬(=== λλ !==)λ§μΌλ‘λ μΆ©λΆνμ§ μμ μ μμ΅λλ€. μ΄λ¬ν κ²½μ°μλ μ€μ²©λ μμ±μ κ°μ΄ λ³κ²½λμλμ§ νμΈνκΈ° μν΄ κΉμ λΉκ΅λ₯Ό μνν΄μΌ ν©λλ€.
lodashμ isEqualμ μ¬μ©ν μμ :
import React, { useState, useRef, useEffect } from 'react';
import isEqual from 'lodash/isEqual';
const useFormStateWithDeepCompare = () => {
const [formState, setFormState] = useState({
address: {
street: '',
city: '',
country: '',
},
preferences: {
newsletter: false,
notifications: true,
},
});
const previousFormStateRef = useRef(formState);
useEffect(() => {
previousFormStateRef.current = formState;
}, [formState]);
const updateField = (field, value) => {
setFormState(prevState => ({
...prevState,
[field]: value,
}));
};
return {
formState,
updateField,
previousFormState: previousFormStateRef.current,
};
};
const MyFormWithDeepCompare = () => {
const { formState, updateField, previousFormState } = useFormStateWithDeepCompare();
const handleChange = (event) => {
const { name, value } = event.target;
updateField(name, value);
};
const handleAddressChange = (field, value) => {
updateField('address', {
...formState.address,
[field]: value,
});
};
useEffect(() => {
if (!isEqual(formState, previousFormState)) {
console.log('Form state changed!');
console.log('Current:', formState);
console.log('Previous:', previousFormState);
}
}, [formState, previousFormState]);
return (
);
};
export default MyFormWithDeepCompare;
μ΄ μμ μμλ lodash λΌμ΄λΈλ¬λ¦¬μ isEqual ν¨μλ₯Ό μ¬μ©νμ¬ νμ¬ νΌ μνμ μ΄μ νΌ μνλ₯Ό κΉκ² λΉκ΅ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ€μ²©λ μμ±μ λ³κ²½ μ¬νμ΄ μ¬λ°λ₯΄κ² κ°μ§λλλ‘ λ³΄μ₯ν©λλ€.
μ°Έκ³ : κΉμ λΉκ΅λ ν° κ°μ²΄μ κ²½μ° κ³μ° λΉμ©μ΄ λ§μ΄ λ€ μ μμ΅λλ€. μ±λ₯ λ¬Έμ κ° λ°μνλ©΄ μ΅μ νλ₯Ό κ³ λ €νμμμ€.
useFormStateλ‘ μ±λ₯ μ΅μ ννκΈ°
ν¨μ¨μ μΈ λ³κ²½ κ°μ§λ React νΌμ μ±λ₯μ μ΅μ ννλ λ° λ§€μ° μ€μν©λλ€. λΆνμν 리λ λλ§μ λλ¦° μ¬μ©μ κ²½νμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€. λ€μμ useFormStateλ₯Ό μ¬μ©ν λ μ±λ₯μ μ΅μ ννκΈ° μν λͺ κ°μ§ κΈ°μ μ
λλ€.
λ©λͺ¨μ΄μ μ΄μ (Memoization)
λ©λͺ¨μ΄μ μ΄μ μ λΉμ©μ΄ λ§μ΄ λλ ν¨μ νΈμΆ κ²°κ³Όλ₯Ό μΊμ±νκ³ λμΌν μ λ ₯μ΄ λ€μ λ°μν λ μΊμλ κ²°κ³Όλ₯Ό λ°ννλ κΈ°μ μ λλ€. React νΌμ λ§₯λ½μμ λ©λͺ¨μ΄μ μ΄μ μ νΌ μνμ μμ‘΄νλ μ»΄ν¬λνΈμ λΆνμν 리λ λλ§μ λ°©μ§νλ λ° μ¬μ©ν μ μμ΅λλ€.
React.memo μ¬μ©νκΈ°:
React.memoλ ν¨μν μ»΄ν¬λνΈλ₯Ό λ©λͺ¨μ΄μ§νλ κ³ μ°¨ μ»΄ν¬λνΈμ
λλ€. propsκ° λ³κ²½λ κ²½μ°μλ§ μ»΄ν¬λνΈλ₯Ό λ€μ λ λλ§ν©λλ€.
import React from 'react';
const MyInput = React.memo(({ value, onChange, label, name }) => {
console.log(`Rendering ${name} input`);
return (
);
});
export default MyInput;
μ λ ₯ μ»΄ν¬λνΈλ₯Ό `React.memo`λ‘ κ°μΈκ³ μ¬μ©μ μ μ areEqual ν¨μλ₯Ό ꡬννμ¬ props λ³κ²½μ λ°λ₯Έ λΆνμν 리λ λλ§μ λ°©μ§νμΈμ.
μ νμ μν μ λ°μ΄νΈ
λ¨μΌ νλλ§ λ³κ²½λμμ λ μ 체 νΌ μνλ₯Ό μ λ°μ΄νΈνμ§ λ§μμμ€. λμ μμ λ νΉμ νλλ§ μ λ°μ΄νΈνμμμ€. μ΄λ κ² νλ©΄ νΌ μνμ λ€λ₯Έ λΆλΆμ μμ‘΄νλ μ»΄ν¬λνΈμ λΆνμν 리λ λλ§μ λ°©μ§ν μ μμ΅λλ€.
μ΄μ μ μ 곡λ μμ λ€μ μ νμ μν μ λ°μ΄νΈλ₯Ό 보μ¬μ€λλ€.
μ΄λ²€νΈ νΈλ€λ¬μ useCallback μ¬μ©νκΈ°
μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μμ μ»΄ν¬λνΈμ propsλ‘ μ λ¬ν λ useCallbackμ μ¬μ©νμ¬ νΈλ€λ¬λ₯Ό λ©λͺ¨μ΄μ§νμμμ€. μ΄λ κ² νλ©΄ λΆλͺ¨ μ»΄ν¬λνΈκ° 리λ λλ§λ λ μμ μ»΄ν¬λνΈκ° λΆνμνκ² λ¦¬λ λλ§λλ κ²μ λ°©μ§ν μ μμ΅λλ€.
import React, { useCallback } from 'react';
const MyForm = () => {
const { formState, updateField } = useFormState();
const handleChange = useCallback((event) => {
const { name, value } = event.target;
updateField(name, value);
}, [updateField]);
return (
);
};
λλ°μ΄μ±(Debouncing) λ° μ€λ‘νλ§(Throttling)
μ¦μ μ λ°μ΄νΈλ₯Ό μ λ°νλ μ λ ₯ νλ(μ: κ²μ νλ)μ κ²½μ°, λλ°μ΄μ± λλ μ€λ‘νλ§μ μ¬μ©νμ¬ μ λ°μ΄νΈ νμλ₯Ό μ ννλ κ²μ κ³ λ €νμμμ€. λλ°μ΄μ±μ ν¨μκ° λ§μ§λ§μΌλ‘ νΈμΆλ ν μΌμ μκ°μ΄ μ§λ νμ μ€νμ μ§μ°μν΅λλ€. μ€λ‘νλ§μ ν¨μκ° μ€νλ μ μλ μλλ₯Ό μ νν©λλ€.
νΌ μν κ΄λ¦¬λ₯Ό μν κ³ κΈ κΈ°μ
λ³κ²½ κ°μ§μ κΈ°λ³Έ μ¬νμ λμ΄μ, νΌ μν κ΄λ¦¬ κΈ°λ₯μ λμ± ν₯μμν¬ μ μλ λͺ κ°μ§ κ³ κΈ κΈ°μ μ΄ μμ΅λλ€.
useFormStateλ₯Ό μ¬μ©ν νΌ μ ν¨μ± κ²μ¬
νΌ μ ν¨μ± κ²μ¬λ₯Ό useFormStateμ ν΅ν©νλ©΄ μ¬μ©μμκ² μ€μκ° νΌλλ°±μ μ 곡νκ³ μ ν¨νμ§ μμ λ°μ΄ν°κ° μ μΆλλ κ²μ λ°©μ§ν μ μμ΅λλ€.
μμ :
import React, { useState, useEffect } from 'react';
const useFormStateWithValidation = () => {
const [formState, setFormState] = useState({
firstName: '',
lastName: '',
email: '',
});
const [errors, setErrors] = useState({
firstName: '',
lastName: '',
email: '',
});
const updateField = (field, value) => {
setFormState(prevState => ({
...prevState,
[field]: value,
}));
};
const validateField = (field, value) => {
switch (field) {
case 'firstName':
if (!value) {
return 'First Name is required';
}
return '';
case 'lastName':
if (!value) {
return 'Last Name is required';
}
return '';
case 'email':
if (!value) {
return 'Email is required';
}
if (!/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(value)) {
return 'Invalid email format';
}
return '';
default:
return '';
}
};
useEffect(() => {
setErrors(prevErrors => ({
...prevErrors,
firstName: validateField('firstName', formState.firstName),
lastName: validateField('lastName', formState.lastName),
email: validateField('email', formState.email),
}));
}, [formState]);
const isValid = Object.values(errors).every(error => !error);
return {
formState,
updateField,
errors,
isValid,
};
};
const MyFormWithValidation = () => {
const { formState, updateField, errors, isValid } = useFormStateWithValidation();
const handleChange = (event) => {
const { name, value } = event.target;
updateField(name, value);
};
const handleSubmit = (event) => {
event.preventDefault();
if (isValid) {
alert('Form submitted successfully!');
} else {
alert('Please correct the errors in the form.');
}
};
return (
);
};
export default MyFormWithValidation;
μ΄ μμ μλ κ° νλμ λν μ ν¨μ± κ²μ¬ λ‘μ§μ΄ ν¬ν¨λμ΄ μμΌλ©° μ¬μ©μμκ² μ€λ₯ λ©μμ§λ₯Ό νμν©λλ€. νΌμ΄ μ ν¨ν΄μ§ λκΉμ§ μ μΆ λ²νΌμ λΉνμ±νλ©λλ€.
λΉλκΈ° νΌ μ μΆ
λΉλκΈ° μμ
(μ: μλ²μ λ°μ΄ν° μ μΆ)μ΄ νμν νΌμ κ²½μ°, λΉλκΈ° μ μΆ μ²λ¦¬λ₯Ό useFormStateμ ν΅ν©ν μ μμ΅λλ€.
import React, { useState } from 'react';
const useFormStateWithAsyncSubmit = () => {
const [formState, setFormState] = useState({
firstName: '',
lastName: '',
email: '',
});
const [isLoading, setIsLoading] = useState(false);
const [submissionError, setSubmissionError] = useState(null);
const updateField = (field, value) => {
setFormState(prevState => ({
...prevState,
[field]: value,
}));
};
const handleSubmit = async () => {
setIsLoading(true);
setSubmissionError(null);
try {
// Simulate an API call
await new Promise(resolve => setTimeout(resolve, 2000));
console.log('Form data:', formState);
alert('Form submitted successfully!');
} catch (error) {
console.error('Submission error:', error);
setSubmissionError('Failed to submit the form. Please try again.');
} finally {
setIsLoading(false);
}
};
return {
formState,
updateField,
handleSubmit,
isLoading,
submissionError,
};
};
const MyFormWithAsyncSubmit = () => {
const { formState, updateField, handleSubmit, isLoading, submissionError } = useFormStateWithAsyncSubmit();
const handleChange = (event) => {
const { name, value } = event.target;
updateField(name, value);
};
return (
);
};
export default MyFormWithAsyncSubmit;
μ΄ μμ μλ λΉλκΈ° μ μΆ κ³Όμ λμ μ¬μ©μμκ² νΌλλ°±μ μ 곡νκΈ° μν λ‘λ© μνμ μ€λ₯ μνκ° ν¬ν¨λμ΄ μμ΅λλ€.
μ€μ μμ λ° μ¬μ© μ¬λ‘
μ΄ κ°μ΄λμμ λ Όμλ κΈ°μ μ λ€μν μ€μ μλ리μ€μ μ μ©λ μ μμ΅λλ€. λ€μμ λͺ κ°μ§ μμ λλ€:
- μ μμκ±°λ κ²°μ νΌ: λ°°μ‘ μ£Όμ, κ²°μ μ 보 λ° μ£Όλ¬Έ μμ½ κ΄λ¦¬.
- μ¬μ©μ νλ‘ν νΌ: μ¬μ©μ μΈλΆ μ 보, νκ²½ μ€μ λ° λ³΄μ μ€μ μ λ°μ΄νΈ.
- λ¬Έμ νΌ: μ¬μ©μ λ¬Έμ λ° νΌλλ°± μμ§.
- μ€λ¬Έμ‘°μ¬ λ° μ€λ¬Έμ§: μ¬μ©μ μ견 λ° λ°μ΄ν° μμ§.
- μ μ¬ μ§μμ νΌ: μ§μμ μ 보 λ° μ격 μμ§.
- μ€μ ν¨λ: μ ν리μΌμ΄μ μ€μ , λ€ν¬/λΌμ΄νΈ ν λ§, μΈμ΄, μ κ·Όμ± κ΄λ¦¬.
κΈλ‘λ² μ ν리μΌμ΄μ μμ μ¬λ¬ κ΅κ°λ‘λΆν° μ£Όλ¬Έμ λ°λ κΈλ‘λ² μ μμκ±°λ νλ«νΌμ μμν΄ λ³΄μμμ€. μ΄ νΌμ μ νλ λ°°μ‘ κ΅κ°μ λ°λΌ λμ μΌλ‘ μ ν¨μ± κ²μ¬λ₯Ό μ‘°μ ν΄μΌ ν©λλ€(μ: μ°νΈλ²νΈ νμμ΄ λ€λ¦). κ΅κ°λ³ μ ν¨μ± κ²μ¬ κ·μΉκ³Ό κ²°ν©λ UseFormStateλ κΉλνκ³ μ μ§λ³΄μ κ°λ₯ν ꡬνμ κ°λ₯νκ² ν©λλ€. κ΅μ νλ₯Ό λκΈ° μν΄ `i18n-iso-countries`μ κ°μ λΌμ΄λΈλ¬λ¦¬ μ¬μ©μ κ³ λ €ν΄ λ³΄μμμ€.
κ²°λ‘
Reactμ useFormState ν
μ μ¬μ©ν λ³κ²½ κ°μ§λ₯Ό λ§μ€ν°νλ κ²μ λ°μμ± μκ³ μ±λ₯μ΄ λ°μ΄λλ©° μ¬μ©μ μΉνμ μΈ νΌμ λ§λλ λ° νμμ μ
λλ€. λ³κ²½ μ¬ν μΆμ , νΌ μν λΉκ΅, μ±λ₯ μ΅μ νλ₯Ό μν λ€μν κΈ°μ μ μ΄ν΄ν¨μΌλ‘μ¨ μνν μ¬μ©μ κ²½νμ μ 곡νλ νΌμ λ§λ€ μ μμ΅λλ€. κ°λ¨ν λ¬Έμ νΌμ λ§λ€λ 볡μ‘ν μ μμκ±°λ κ²°μ νλ‘μΈμ€λ₯Ό λ§λ€λ , μ΄ κ°μ΄λμμ μ€λͺ
ν μμΉμ κ²¬κ³ νκ³ μ μ§λ³΄μ κ°λ₯ν νΌ μ루μ
μ ꡬμΆνλ λ° λμμ΄ λ κ²μ
λλ€.
μ ν리μΌμ΄μ μ νΉμ μꡬ μ¬νμ κ³ λ €νκ³ νμμ κ°μ₯ μ ν©ν κΈ°μ μ μ ννλ κ²μ μμ§ λ§μμμ€. λ€μν μ κ·Ό λ°©μμ μ§μμ μΌλ‘ λ°°μ°κ³ μ€νν¨μΌλ‘μ¨ νΌ μν κ΄λ¦¬ μ λ¬Έκ°κ° λμ΄ λ°μ΄λ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό λ§λ€ μ μμ΅λλ€.